# -*- coding: utf-8 -*-

# === システム全体の共通ヘルパーモジュール
module ApplicationHelper
  include CommonUtils
  include Mobile::EmoticonHelper

  def format_description_links
    result = []
    result << link_to("Markdown記法の説明", "http://daringfireball.net/projects/markdown/syntax.php", :target => "_new")
    result << link_to("Textile記法の説明", "http://redcloth.org/hobix.com/textile/", :target => "_new")
    return result.join("　").html_safe
  end

  # === ログイン中かどうかを真偽値で返す
  # ログイン済みであればtrue、違ったらfalse
  def logged_in?
    return !!@user
  end
  
  # === Timeオブジェクトのフォーマット定義
  # デフォルトのフォーマットを定義すると共に、任意のフォーマットも受け付ける
  # TODO: デフォルトが日付しか扱わないのにtime_formatとはこれいかに。
  def time_format(time, format = nil)
    format ||= "%Y-%m-%d"
    return time.strftime(format)
  end

  # === メッセージなどの本文表示形式選択
  # 第一引数で与えられた文字列を、第二引数で与えられるフォーマット形式の文字列
  # とみなして、整形結果を返す。
  # デフォルトはマークダウン形式。
  def text_format(text, format = "markdown")
    case format.to_s
    when "plain"
      str = rm_html_tag(text)
      return replace_uri(simple_format(str)).html_safe
    when "textile"
      return RedCloth.new(text, [:filter_html]).to_html.html_safe
    else  # markdown
      return BlueCloth.new(text, [:filter_html]).to_html.html_safe
    end
  end

  # === SELECTタグのオプション生成を行う
  # TODO: これはRails標準で同じ機能があった。いつか本機能は抹殺すること。
  def select_options_from_array(ary, selected_str = "")
    result = ""
    ary.each do |pair|
      selected = ""
      selected = "selected" if pair[1] == selected_str
      result += "<option #{selected} value='#{h(pair[1])}'>#{h(pair[0])}</option>\n"
    end
    return result.html_safe
  end

  # === クラウドタグの連結
  # クラウドタグを連結して文字列形式で返す。
  # 現状、単純に配列をカンマでjoinしただけだが、将来的に変更するかも知れない
  # のでヘルパー化してある。
  def format_tag_list(list)
    return list.join(", ")
  end

  # === ユーザーのアバター画像を表示するIMAGEタグ取得
  # 文字列としてIMAGEタグを返す。
  def get_avatar_image(obj, column_name = :avatar)
    avatar_url = obj.__send__(column_name.to_sym).url
    if avatar_url
      return image_tag avatar_url
    else
      return image_tag "default_avatar.png"
    end
  end

  # === メッセージやブログなどの添付ファイルが画像だった場合それを表示できる
  # IMAGEタグを返す
  # TODO: サムネイルを返すよう修正しよう。
  def view_attachment_file(attachment, url, thumb_url = nil)
    case attachment.content_type
    when /\Aimage\/.*\Z/
      thumb_url ||= url
      return link_to(image_tag(thumb_url), url)
    else
      return link_to(attachment.filename, url)
    end
  end

  # === HTMLラベルを返す
  def label_for(label, obj, name, label_class = 'label')
    if obj.errors[name.to_sym]
      return "<div class='fieldWithErrors'>\n<label class='#{label_class}'>#{h(label)}</label>\n<span class='error'>#{h(obj.errors[name.to_sym].first)}</span></div>\n".html_safe
    else
      return "<label class='label'>#{h(label)}</label>\n".html_safe
    end
  end

  # === 月を表す文字をリンク化したAタグを返す
  def month_link(month_date)
    link_to(I18n.localize(month_date, :format => "%B"), {:month => month_date.month, :year => month_date.year})
  end

  # === イベントカレンダーのデフォルトオプションをハッシュ形式で返す
  def event_calendar_opts(width, height, mini_calendar = nil)
    link = mini_calendar ? false : "new"
    { 
      :year => @year,
      :month => @month,
      :width => width,
      :height => height,
      :event_strips => @event_strips,
      :link_to_day_action => link,
      :use_all_day => true,
      :month_name_text => I18n.localize(@shown_month, :format => "%B %Y"),
      :previous_month_text => "<< " + month_link(@shown_month.prev_month),
      :next_month_text => month_link(@shown_month.next_month) + " >>"    }
  end

  # === イベントカレンダーを指定サイズで返す
  def event_calendar(width = 800, height = 600, mini_calendar = nil)
    # args is an argument hash containing :event, :day, and :options
    calendar event_calendar_opts(width, height, mini_calendar) do |args|
      event = args[:event]
      %(<a href="/event/schedules/#{event.id}show" title="#{h(event.name)}">#{h(event.name)}</a>)
    end
  end

  # === 携帯端末用のページネーションメソッド
  def will_paginate_mobile(collection = nil, options = {})
    will_paginate(collection,
                  options.merge(:next_label => "[#{emoticon_6}次へ]",
                                :previous_label => "[#{emoticon_4}前へ]",
                                :renderer => 'Mobile::LinkRenderer'
                               ))
  end

  # === 引数で指定されたパスが現在のパスと同じかどうかを真偽値で返す
  def is_current_path?(url, args = nil)
    current_path = request.env['PATH_INFO']

    if url.is_a?(Symbol)
      if args
        url = self.__send__(url, args)
      else
        url = self.__send__(url)
      end
    end

    current_path == url
  end

  # === 文字列中のHTMLタグを削除するメソッド
  def rm_html_tag(text)
    while /<[^<>]*>/ =~ text
      text.sub!(/<br \/>/, "\n")
      text.sub!(/<[^<>]*>/,"")
    end
    text
  end

  # === 文字列中のURIをリンクに変換するメソッド
  def replace_uri(org_str)
    str = org_str.dup
    uri_reg = URI.regexp(['http', 'https'])
    str.gsub!(uri_reg) {%Q{<a href="#{$&}" target="_new">#{$&}</a>}}
    return str
  end
end
